package cn.bonoon.util;

import java.math.BigDecimal;

/**
 * 处理两个浮点类型的数字运算的精度问题
 * @author jackson
 *
 */
public class DoubleHelper {

	public static double add(double d0, double d1){
		return BigDecimal.valueOf(d0).add(BigDecimal.valueOf(d1)).doubleValue();
	}

	public static double add2(Double... ds){
		BigDecimal val = null;
		for(Double d : ds){
			if(d == null) continue;
			if(val == null) val = BigDecimal.valueOf(d);
			else val = val.add(BigDecimal.valueOf(d));
		}
		return null == val ? 0D : val.doubleValue();
	}
	
	public static double add(double d0, double... ds){
		BigDecimal val = BigDecimal.valueOf(d0);
		for(double d : ds){
			val.add(BigDecimal.valueOf(d));
		}
		return val.doubleValue();
	}

	public static double add(double d0, Double... ds){
		BigDecimal val = BigDecimal.valueOf(d0);
		for(Double d : ds){
			if(null != d) val.add(BigDecimal.valueOf(d));
		}
		return val.doubleValue();
	}
	
	
	public static double add(double d0, Object... ds){
		BigDecimal val = BigDecimal.valueOf(d0);
		for(Object d : ds){
			if(d instanceof Number) val.add(BigDecimal.valueOf(((Number) d).doubleValue()));
		}
		
		return d0;
	}
	//double相减
	public static double subtract(double d0, double d1){
		return BigDecimal.valueOf(d0).subtract(BigDecimal.valueOf(d1)).doubleValue();
	}
	
	public static double subtract(double d0, double... ds){
		BigDecimal val = BigDecimal.valueOf(d0);
		for(double d : ds){
			val = val.subtract(BigDecimal.valueOf(d));
		}
		return val.doubleValue();
	}
	
	//double与int相乘
	public static double multiply(double d0, int d1){
		BigDecimal multiply =  BigDecimal.valueOf(d0).multiply(BigDecimal.valueOf(d1)).setScale(4, BigDecimal.ROUND_HALF_EVEN);
		return multiply.doubleValue();
	}
	//double与double相乘
	public static double multiply(double d0, double d1){
		BigDecimal multiply =  BigDecimal.valueOf(d0).multiply(BigDecimal.valueOf(d1)).setScale(4, BigDecimal.ROUND_HALF_EVEN);
		return multiply.doubleValue();
	}
	
	//double与double相除
	public static double divide(double d0, double d1){
		double d2 = (double) ((double) d1 == 0d ? 1d : d1);
		return BigDecimal.valueOf(d0).divide(BigDecimal.valueOf(d2),4, BigDecimal.ROUND_HALF_EVEN).doubleValue();
	}
	
	//double与int相除
	public static double divide(double d0, int d1){
		double d2 = (double) ((double) d1 == 0d ? 1d : d1);
		return BigDecimal.valueOf(d0).divide(BigDecimal.valueOf(d2),4, BigDecimal.ROUND_HALF_EVEN).doubleValue();
	}
}
